개발자의 길 52

[Infra] Docker (1) - Docker Engine

도커 도커 엔진 도커의 기본 단위는 '이미지'와 '컨테이너' 이다. 도커 이미지와 도커 컨테이너 도커 이미지는, 도커 컨테이너를 생성하기 위해 필요한 요소, 여러 계층으로 이루어진 바이너리 파일을 의미한다. 컨테이너를 실행시킬 때 해당 파일을 읽어서 실행시킨다. 이미지의 이름은.[저장소이름]:[이미지이름]:[태그] 로 구성된다. (alicek106/ubuntu:14.04) \ $ docker pull centos:7 # 이미지 받기 $ docker images # 받은 이미지 확인 도커 컨테이너는 실행중인 가상 환경이라고 생각하면 된다. 도커 컨테이너는 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 또한 개발 시점에서 컨테이너에 서버 배포를 한다던가 하는 작업을 한 뒤 운영에 배포하..

개발자의 길 2024.04.14

[Network] VPN 의 원리에 대해서

VPN 은 Virtual Private Network 로써, 말 그대로 가상으로 사설망과 같은 형태로 연결되는 네트워크를 의미한다. 사설망이라는 건 인터넷과는 차단된 독자적인 네트워크 체계를 의미한다. 특정 회사의 사설망이 서울에 하나 부산에 하나 있다고 하자, 회사 내부의 사람끼리는 두개의 사설망을 연결해서 같이 쓰고 싶다면 두 사설망을 연결해주는 전용 회선이 필요하다. 예전에는 이런 회선을 대여하거나 해서 비용을 내고 썻다고 하는데, 비용이 너무나 많이 들다 보니 회선을 따로 독점하지 않고 두 사설망을 연결하는 방법을 찾다가 나온게 VPN 이라고 한다. VPN 은 사설망과 다른 네트워크나 클라이언트와 인터넷으로 통신을 하기 위해서 서로 주고받는 메시지를 서로만 알고있는 암호키를 이용해서 캡슐화, 암호..

[Network][AWS] AWS 네트워크 구성요소 - 3. 네트워크 보안과 부가 서비스

이번장에서는 AWS 의 보안 구성 요소와 부가적인 서비스 들에 대해 알아보겠다. 보안 그룹(Security Group) 보안 그룹은 인스턴스(RDS, EC2) 단위로 인바운드와 아웃바운드를 정의하는 가상의 방화벽이다. 특정 인스턴스의 특정 Port(예: HTTP/HTTPS 등) 에 대한 요청을 할 수 있는 IP 리스트를 관리함으로써 인스턴스에 접근할 수 있는 범위를 규정한다. 보안 그룹은 상태를 유지하는(stateful) 정책으로 접근가능여부를 판단한다. 무슨 소리냐면, 이전에 들어온 요청의 상태정보를 기억해서 요청에 대한 응답을 할 때 같은 '상태' 라고 판단되면 보안정책으로 통신을 막거나 하지 않는다는 소리이다. 간단하게 예를 들어서 우리가 가장 흔하게 사용하는 HTTP 프로토콜 통신으로 예를 들어보..

[Network][AWS] AWS 네트워크 구성요소 - 2. 네트워킹 구성요소

AWS 환경에는 네트워크를 구성하고 보안이나 통신 설정들을 조절할 수 있도록 하는 구성요소들이 있다. 이 포스팅에서는 VPC, 서브넷, 인터넷 게이트웨이, NAT 게이트웨이에 대해 설명하고자 한다. Availability zone (AZ) AWS 는 1차적으로 리전이라는 그룹으로 나누어 지고, 리전 내에는 AZ 라는 영역으로 나누어 진다. 서울 리전을 예로 들어 보자면, 서울 리전 내에는 3개의 AZ 가 있는데, 이 AZ는 실제로 현실에 존재하는 데이터 센터 하나를 의미한다. AWS 가 인터넷 클라우드 서비스이긴 하나 실제로는 거대한 데이터 센터의 컴퓨팅 능력을 떼서 제공하는 것이기 때문에, 현실세계의 서버가 필요하다. 이 데이터 센터 하나가 하나의 AZ 에 대응하게 된다. 이렇게 AZ 를 나누는 이유는..

[Network][AWS] AWS 네트워크 구성요소 - 1. 인터넷 네트워크 기초와 IP 주소 체계

우리는 컴퓨터와 인터넷을 통해 다른 컴퓨터와 채팅이나 게임도 할 수 있고, 여러 기업의 사이트를 접속하기도 하며, 날씨도 본다. 내가 특정 사이트나 다른사람과 연결되고 싶을 때 어디로 연결되어야 되는지 알아야 하는데, 그 '어디'를 나타내는 것이 IP Address 이다. 게임 서버에 접속하려면 그 서버의 IP 주소를 알아야 하고, 다른 사람과 직접 연결되어 파일을 주고받으려고 해도 IP 주소가 필요하다. 채팅을 하기 위해 중간에서 매개 역할을 해주는 서버에 접속하기 위해서도 IP 주소는 필요하다. 이번 챕터에서는 IP 주소가 어떻게 생겨먹었는지, 어떤 종류가 있는지, 어떤 방식으로 이용되는지 알아보도록 하자. IP Address 인터넷에서 기기를 식별하는 IP 주소는 처음에는 32비트로 이루어진 숫자로..

[Network] AWS 에서의 네트워크 구성요소에 대해 - 서론

이번에 AWS EC2 인스턴스에 띄어져서 열심히 일하고 있는 회사의 웹서버, API 서버 구성을 검토받던 중 보안을 위한 네트워크 구성이 미비한 것을 지적받고 개선 작업을 착수 중에 있다. 그런데 현재는 AWS 내에서 보안 그룹, 서브넷, VPC, 인터넷 게이트웨이, NAT 등 여러 요소들의 존재여부만 알고 있다거나 살짝 건들이면 사내/외부에서 접속이 가능해 진다던지 그런 부분만 알고 있었는데, 개선 작업을 하고 컨설팅을 받는 과정에서 자세한 지식이 필요하다고 생각 되어서 정리하게 되었다. 아래와 같은 과정으로 정리해 갈 예정인데, 어느정도 사전 리서치를 진행해 보고 chat gpt 를 활용해서 공부 및 정리 계획을 세웠다. 파트별로 하나의 포스팅을 할예정이니 참고 바란다. 1) 네트워크 기초와 IP 주..

[Java] Boxing 과 Unboxing

Java 에서는 원시 타입과 참조 타입이라는 개념이 있다. 원시 타입은 int, long, char 등의 가장 기본적인 숫자, 문자등을 저장하는 타입이고, 참조 타입은 Integer, String, Object 등이 있다. 원시 타입은 메모리에 할당된 변수에 '값' 이 바로 들어가 있는 경우를 말하고, 참조 타입은 메모리에 할당된 변수에 '메모리 주소'가 들어가 있어서, 해당 메모리 주소를 한번 더 참조해서 '값' 을 찾아야 한다. Boxing 과 Unboxing 은 주로 이러한 원시 타입과 참조 타입간의 변환 가정을 말한다. Boxing : 원시 타입 -> 참조 타입으로의 변환 int 를 Integer 로 변환. long 을 Long 으로 변환, char 를 Char 로 변환 Unboxing : 참조 ..

개발자의 길 2024.01.22

[MySQL] 스토어드 프로시저

개발을 하다 보면 쿼리문 작성에 시간을 많이 쏟게 되고, ORM 이던 Raw query 문이던 쿼리 작성을 위한 코드를 프로젝트에 많이 넣게 되는데, 이런 쿼리 레벨에서의 로직을 DB 에 직접 넣을 수 가 있다. MySQL 에서 '스토어드 프로시저' 라는 기능으로 제공되고 있다. 간단히 말하면 데이터베이스 내에 하나의 함수를 작성한다고 보면 된다. 스토어드 프로시저를 쓰면 아래와 같은 장점이 있다. 성능 향상: 스토어드 프로시저는 데이터베이스 서버에서 실행되므로 네트워크 지연을 줄일 수 있고, 데이터 처리를 최적화할 수 있다. 재사용성: 스토어드 프로시저는 여러 번 호출할 수 있으며, 코드 중복을 방지하고 관리가 쉽다. 보안 강화: 애플리케이션에서 직접 SQL 쿼리를 작성하는 대신 스토어드 프로시저를 호..

[MySQL] MySQL 의 Isolation level ( 격리 레벨 )

여타 RDBMS 와 같이 MySQL 역시 데이터의 정합성을 위해서 데이터를 잠그거나, transaction 단위로 작업을 관리하고, 각 트랜잭션이 수행한 작업들을 별도 로그에 저장해서 언제든 롤백할 수 있도록 관리하고 있다. 여기서 격리 레벨은 이 데이터 정합성을 지키기 위해 얼마나 엄격히 트랜잭션간의 작업을 격리시키는지를 의미하는데, 다음과 같이 4 단계의 격리 레벨이 있다. READ UNCOMMITTED 가장 낮은 격리 수준으로, 다른 트랜잭션에서 커밋되지 않은 변경 내용을 볼 수 있으며, 이로 인해 'Dirty Read'가 발생할 수 있다. READ COMMITTED 커밋된 데이터만 읽을수 있게 되어서 'Dirty Read'는 방지하지만, 'Non-Repeatable Read' 문제는 여전히 발생한..

[SQLAlchemy] SQLAlchemy 에서 DB 에 접근하는 방법 - 2

이전 게시글에서 DB 에 접근하는 방법과 DB 에 데이터를 반영하는 방식에 대해 설명하였는데 정리하자면 다음과 같다. - SQLAlchemy 에서는 session 이라는 영역에 DB 에 반영할 데이터를 저장하고 있다가 flush 나 commit 등을 수행하면 DB 에 반영된다 - 이전의 DB 연결방법인 Flask app 객체를 SQLAlchemy 생성자에 전달해서 DB 커넥션을 하는 방법에서는 SQLAlchemy.session 변수로 자동 생성된 session 을 이용할 수 있다 이번 포스트에서는 session 을 제어하는 여러 방법을 이야기하고자 한다. session 을 제어하는 방법 session.begin() 이 메소드를 호출하면 해당 세션에 대한 데이터베이스 작업은 이 트랜잭션의 일부가 된다. 명..

개발자의 길 2023.12.18
반응형